package com.aaa.yunMall.utils;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import java.io.IOException;
import java.io.InputStream;

/**
 * @author LQY
 * @date 2020-07-10 16:02
 */
public class FtpUtils {

    private FtpUtils(){

    }

    /**
     * ftp文件上传方法工具
     * @param host
     * @param port
     * @param username
     * @param password
     * @param basePath
     * @param filePath
     * @param fileName
     * @param inputStream
     * @return
     */
    public static Boolean upload(String host, Integer port, String username, String password, String basePath,
                                 String filePath, String fileName, InputStream inputStream){
        /**
         * 最终按照每天日期的文件夹来进行上传
         * 2020/7/20--->20文件夹
         * cd /home/redis/src
         */
        //创建临时路径
        String tempPath = "";
        //创建FTPClient对象(这个对象就是ftp给java所提供的api)
        FTPClient ftpClient = new FTPClient();
        try {
            //定义返回状态码
            int replyCode;
            //连接ftp
            ftpClient.connect(host,port);
            //登录ftp服务器
            ftpClient.login(username,password);
            //接受返回的状态码
            // 如果成功返回230，如果失败返回503
            replyCode = ftpClient.getReplyCode();
            //判断
            if(!FTPReply.isPositiveCompletion(replyCode)){
                //连接失败了
                ftpClient.disconnect();
                return false;
            }
            // 先检测我要上传的目录是否存在(2020/07/10)
            // basePath:/home/ftp/www
            // filePath: /2020/07/10
            // --->/home/ftp/www/2020/07/10
            if(!ftpClient.changeWorkingDirectory(basePath + filePath)){
                //该文件夹不存在
                //创建文件夹
                // [2020, 07, 10] ["", "2020", "07", "10"]
                String[] dirs = filePath.split("/");
                //把basePath赋值给临时路径   tempPath:/home/ftp/www
                tempPath = basePath;
                //循环
                for (String dir : dirs){
                    if(null == dir || dir.isEmpty()){
                        //没有数据
                        continue;
                    }
                    //拼接临时路径(如果没有进入if,则取到的值应该就是2020)
                    tempPath += "/" + dir;
                    //tempPath: /home/ftp/www/2020
                    //再次检测tempPath是否存在
                    if(!ftpClient.makeDirectory(tempPath)){
                        //文件夹不存在，创建文件夹
                        if(!ftpClient.makeDirectory(tempPath)){
                            //说明文件夹创建失败
                            return false;
                        }else {
                            //严谨判断，判断创建出来的目录确实存在
                            ftpClient.changeWorkingDirectory(tempPath);
                        }
                    }
                }
            }
            //把文件转换为二进制的形式来进行上传
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            //这里是真正的文件上传
            if(!ftpClient.storeFile(fileName,inputStream)){
                //说明上传失败
                return false;
            }
            //关闭输入流
            inputStream.close();
            //退出ftp
            ftpClient.logout();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(ftpClient.isConnected()){
                try {
                    //说明还在连接中(说明正在占用流量)
                    ftpClient.disconnect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return true;
    }

}
